package com.lls.punchin;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.lls.punchin.common.base.BaseEntity;

import java.util.Collections;

public class CodeGenerator {

    public static void main(String[] args) {
        // 数据库连接配置
        String url = "jdbc:mysql://124.223.175.251:3306/vb_test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai";
        String username = "user001";
        String password = "user@001";

        // 项目路径
        String projectPath = System.getProperty("user.dir");

        FastAutoGenerator.create(url, username, password)
                         // 1. 全局配置
                         .globalConfig(builder -> {
                             builder
                                     .author("lls") // 设置作者
                                     .outputDir(projectPath + "\\src\\main\\java") // 指定输出目录
                                     .disableOpenDir() // 禁止打开输出目录
                                     .commentDate("yyyy-MM-dd") // 注释日期格式
                             ; // 覆盖已生成文件（谨慎使用，首次生成后可注释掉）
                         })
                         // 2. 包配置
                         .packageConfig(builder -> {
                             builder
                                     .parent("com.lls.punchin") // 设置父包名
                                     .entity("entity") // 实体类包名
                                     .mapper("dao") // Mapper 接口包名
                                     .service("service") // Service 接口包名
                                     .serviceImpl("service.impl") // Service 实现类包名
                                     .controller("controller") // Controller 包名
                                     .pathInfo(Collections.singletonMap(OutputFile.xml, projectPath + "\\src\\main\\resources\\mybatis\\mapper")); // 指定 XML 文件位置
                         })
                         // 3. 策略配置
                         .strategyConfig(builder -> {
                             builder
                                     .addInclude("sys_user", "activity_info", "article_info", "points_record",
                                             "punch_in_record", "question_answer", "sys_dict", "sys_file_info") // 设置需要生成的表名，多个用英文逗号分割
//                                     .addTablePrefix("t_", "sys_") // 设置过滤表前缀（例如表 t_user 生成实体为 User）

                                     // 实体类策略
                                     .entityBuilder()
                                     .enableLombok() // 启用 Lombok
                                     .superClass(BaseEntity.class)
                                     .formatFileName("%sEntity")
                                     .naming(NamingStrategy.underline_to_camel) // 表名下划线转驼峰
                                     .columnNaming(NamingStrategy.underline_to_camel) // 列名下划线转驼峰
                                     .enableTableFieldAnnotation() // 字段上添加注解（例如 @TableField)
                                     .logicDeleteColumnName("isvalid") // 逻辑删除字段名（根据实际情况设置）

                                     // Controller 策略
                                     .controllerBuilder()
                                     .enableRestStyle() // 生成 @RestController
                                     .enableHyphenStyle() // 映射中使用连字符（例如 /user_info）

                                     // mapper配置
                                     .mapperBuilder()
                                     .enableMapperAnnotation() //开启@Mapper注解

                                     // Service 策略
                                     .serviceBuilder()
                                     .formatServiceFileName("%sService") // 格式化 service 接口文件名称，例如 UserService
                                     .formatServiceImplFileName("%sServiceImpl"); // 格式化 service 实现类文件名称
                         })
                         // 4. 模板引擎配置（这里使用 Freemarker）
                         .templateEngine(new FreemarkerTemplateEngine())
                         .execute(); // 执行生成
    }


}
